#include "can_demo.h"
#include "gpio.h"
#include "can.h"
#include "isr.h"

static void can_recv_handler(void *msg)
{
	INTC_ClearPendingIRQ(CAN0REC_IRQn);
	
	if (CAN_GetFlagStatus(CAN0, CAN_FLAG_REC) != RESET)
	{PORT->P5 ^= (1<<0);
		CAN_ClearFlag(CAN0, CAN_FLAG_REC);
		
		CAN_Receive_IT(CAN0, CAN0MSG07, &CAN_RecvMsg);
	}
}

void CAN_Port_Config(void)
{
	GPIO_InitTypeDef	GPIO_InitStruct;
	CAN_InitTypeDef		CAN_InitStruct;
	
#ifdef BAT32G137_64PIN	
	/* GPIO AF set for CAN bus */
	GPIO_PinAFConfig(GPIO_PORT0, GPIO_Pin_2, GPIO_P02, GROUP_AF_CTXD);
	GPIO_PinAFConfig(GPIO_PORT0, GPIO_Pin_3, GPIO_P03, GROUP_AF_CRXD);
	
	/****** GPIO for CAN bus init ******/
	/* CTXD pin init */
    GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_2 ;
    GPIO_InitStruct.GPIO_Mode   = GPIO_Mode_OUT;
	GPIO_InitStruct.GPIO_Level  = GPIO_Level_HIGH;
	GPIO_InitStruct.GPIO_Ctrl   = GPIO_Control_DIG;
    GPIO_Init(GPIO_PORT0, &GPIO_InitStruct);
	
	/* CRXD pin init */
    GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_3 ;
    GPIO_InitStruct.GPIO_Mode   = GPIO_Mode_IN;
	GPIO_InitStruct.GPIO_Ctrl   = GPIO_Control_DIG;
    GPIO_Init(GPIO_PORT0, &GPIO_InitStruct);
#else
	/* GPIO AF set for CAN bus */
//	GPIO_PinAFConfig(GPIO_PORT0, GPIO_Pin_0, GPIO_P00, GROUP_AF_CTXD);
//	GPIO_PinAFConfig(GPIO_PORT0, GPIO_Pin_1, GPIO_P01, GROUP_AF_CRXD);


	/****** GPIO for CAN bus init ******/
	/* CTXD pin init */
    GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_0 ;
    GPIO_InitStruct.GPIO_Mode   = GPIO_Mode_OUT;
	GPIO_InitStruct.GPIO_Level  = GPIO_Level_HIGH;
	GPIO_InitStruct.GPIO_Ctrl   = GPIO_Control_DIG;
    GPIO_Init(GPIO_PORT0, &GPIO_InitStruct);
	
	/* CRXD pin init */
    GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_1 ;
    GPIO_InitStruct.GPIO_Mode   = GPIO_Mode_IN;
	GPIO_InitStruct.GPIO_Ctrl   = GPIO_Control_DIG;
    GPIO_Init(GPIO_PORT0, &GPIO_InitStruct);


//        PORT->PIOR3 &= ~(1 << 3);    /* allocate CTXD0 to P02 */ 
////        PORT->P0    |=  (1 << 0);    /* P02 output high level */ 
//        PORT->PM0   &= ~(1 << 0);    /* P02 is used as CTXD0 output */ 


///* ToDo: You can allocate the CRXD0 to P03 or P50 with PIOR33 register */

//        PORT->PIOR3 &= ~(1 << 3);    /* allocate CRXD0 to P03 */ 
//        PORT->PM0   |=  (1 << 1);    /* P03 is used as CRXD0 input */ 


#endif
	
	/****** GPIO for STB init ******/
//	GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_0;
//	GPIO_InitStruct.GPIO_Mode   = GPIO_Mode_OUT;
//	GPIO_InitStruct.GPIO_Ctrl   = GPIO_Control_DIG;
//	GPIO_InitStruct.GPIO_PuPd   = GPIO_PuPd_DOWN;
//	GPIO_InitStruct.GPIO_Level  = GPIO_Level_LOW;
//	GPIO_Init(GPIO_PORT12, &GPIO_InitStruct);
	
	/****** CAN bus periphal init ******/
	CAN_InitStruct.CAN_Prescaler = 2;			//2;
	CAN_InitStruct.CAN_BitRatePrescaler = 5;	//2;
	CAN_InitStruct.CAN_SJW = CAN_SJW_1tq;		//CAN_SJW_2tq;
	CAN_InitStruct.CAN_BS1 = CAN_BS1_12tq;		//CAN_BS1_14tq;
	CAN_InitStruct.CAN_BS2 = CAN_BS2_3tq;		//CAN_BS2_1tq;
	CAN_InitStruct.CAN_OperateMode = CAN_OpMode_Initial;
	CAN_InitStruct.MASK1 =0;// 0x1fffffffU;
	CAN_InitStruct.MASK2 =0;// 0x1fffffffU;
	CAN_InitStruct.MASK3 =0;// 0x1fffffffU;
	CAN_InitStruct.MASK4 =0;// 0x1fffffffU;
	CAN_Init(CAN0, &CAN_InitStruct);
	
	CAN_OperatingModeRequest(CAN0, CAN_OpMode_Normal);
	
	CAN_ITConfig(CAN0, CAN_IT_REC, ENABLE);
	
	ISR_Register(CAN0REC_IRQn, can_recv_handler);
	
	INTC_EnableIRQ(CAN0REC_IRQn);
}
